home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / gemxx19.zoo / gem++19 / include / contract.h < prev    next >
C/C++ Source or Header  |  1993-04-28  |  2KB  |  136 lines

  1. /////////////////////////////////////////////////////////////////////////
  2. //
  3. // File:    contract.h
  4. //
  5. // Decription:
  6. //        Dieses File stellt einige Makros zur Verfuegung,
  7. //        mit denen Design by Contract, siehe B. Meyer:
  8. //        'Object Oriented Software Construction', realisiert
  9. //        werden kann.
  10. //
  11. //        Preconditions werden mit Require( exp ),
  12. //        Postconditions mit Ensure( exp ) ueberprueft.
  13. //
  14. //        Code wird aber nur erzeugt, wenn das Symbol DCL_DEBUG
  15. //        mittels der Option -DDCL_DEBUG oder per #define
  16. //        deklariert wurde.
  17. //
  18. //        Alternativ kann auch im File debug.h dieses Makro,
  19. //        aktiviert oder deaktiviert werden.
  20. //
  21. // $Author: pareis $
  22. //
  23. // $Id: Item.h,v 1.2 1992/06/14 17:29:22 pareis Exp $
  24. //
  25. /////////////////////////////////////////////////////////////////////////
  26.  
  27.  
  28. #ifndef _Contract_h
  29. #define _Contract_h
  30.  
  31.  
  32. #if !defined( DCL_DEBUG ) && !defined( DCL_AES_DEBUG )
  33.  
  34. #  define Require( cond )
  35. #  define Ensure( cond )
  36. #  define Inspect( expr )
  37.  
  38. #else
  39.  
  40.  
  41. #  include <stdio.h>
  42. #  include <stdlib.h>
  43.  
  44.  
  45.  
  46.  
  47.  
  48. #  ifdef DCL_AES_DEBUG
  49.  
  50. #    include <aesbind.h>
  51. #    include <string.h>
  52.  
  53.  
  54. #    define        __MESSAGE( name,prefix,cond )            \
  55. {                                    \
  56.     if( !(cond) )                            \
  57.     {                                \
  58.         char buf[120];                        \
  59.                                     \
  60.         sprintf( buf, "[3][  %scondition failed in file  |  %s,"\
  61.             " line %ld:| |  %s( %s )  ][  Exit  | Ignore ]",\
  62.             prefix, __FILE__, (long)(__LINE__), name,    \
  63.             #cond );                    \
  64.                                     \
  65.         if( form_alert( 1, buf ) == 1 )                \
  66.             exit(1);                    \
  67.     }                                \
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  
  74. inline void Inspect( const char *message )
  75. {
  76.     char buf[120] = "[1][\0";
  77.     
  78.     strcat( buf, message );
  79.     strcat( buf, "][ Continue ]" );
  80.     
  81.     form_alert( 1, buf );
  82. }
  83.  
  84.  
  85.  
  86.  
  87.  
  88. #  else
  89.  
  90.  
  91.  
  92.  
  93. #    include <unistd.h>
  94.  
  95.  
  96. #    define __FAILED_MSG  "%scondition failed in file %s, line %ld:\n"    \
  97.             "%s( %s )\n"
  98.  
  99.  
  100. #    define    __MESSAGE( name,prefix,cond )                \
  101. {                                    \
  102.     if( !(cond) )                            \
  103.     {                                \
  104.         fprintf( stderr, __FAILED_MSG, prefix, __FILE__,    \
  105.             (long)(__LINE__), name, #cond );        \
  106.         sleep(2);                        \
  107.         exit(1);                        \
  108.     }                                \
  109. }
  110.  
  111.  
  112.  
  113. #  endif    // #ifdef DCL_AES_DEBUG
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121. #  define Require( expr )    __MESSAGE( "Require","Pre",expr )
  122. #  define Ensure( expr )    __MESSAGE( "Ensure","Post",expr )
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129. #endif    // #ifndef DCL_DEBUG
  130.  
  131.  
  132.  
  133.  
  134.  
  135. #endif    // #ifndef _Contract_h
  136.